package com.mcm.vistas;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;

import javax.swing.BoxLayout;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableCellEditor;
import javax.swing.text.PlainDocument;

import com.mcm.dao.ProductosDao;
import com.mcm.dao.VentasDao;
import com.mcm.dto.Producto;
import com.mcm.dto.ProductoVenta;
import com.mcm.modelos.ModeloProducto;
import com.mcm.modelos.ModeloVenta;
import com.mcm.util.MyIntFilter;

public class Venta extends JFrame implements ActionListener
{
	private static final long serialVersionUID = -4013361982686075441L;
	
	ModeloVenta mv;
	JTextField tf;
	JTable table;
	ModeloProducto modeloProducto;
	
	public Venta(List<ProductoVenta> listaFactura, ModeloProducto mp)
	{
		personalizarVentana();
		crearTabla(listaFactura);
		crearTotal();
		crearBotones();
		modeloProducto = mp;
	}
	
	private void personalizarVentana() 
	{
		this.setVisible(true);
		this.setSize(new Dimension(500, 300));
		this.setResizable(false);
		setTitle("Venta");
		getContentPane().setLayout(new BoxLayout(this.getContentPane(),BoxLayout.Y_AXIS));
	}
	
	private void crearTabla(List<ProductoVenta> lista)
	{
		mv = new ModeloVenta(lista);
		table = new JTable(mv);
//		table.setPreferredSize(new Dimension(400, 200));
		table.getModel().addTableModelListener(new TableModelListener() 
		{
			@Override
			public void tableChanged(TableModelEvent e) 
			{
		        ModeloVenta model = (ModeloVenta)e.getSource();
		        Double totalActualizado = model.getTotal();
		        tf.setText(totalActualizado.toString());
			}
		});
		
		columnaCantidadEditable(table);
		
		JScrollPane scrollPane = new JScrollPane(table);
		scrollPane.setPreferredSize(new Dimension(200, 200));
		this.add(scrollPane);
	}
	
	private void columnaCantidadEditable(JTable table)
	{
		JTextField jtf = new JTextField();
		PlainDocument doc = (PlainDocument) jtf.getDocument();
		doc.setDocumentFilter(new MyIntFilter());		
		DefaultCellEditor singleclick = new DefaultCellEditor(jtf);
	    singleclick.setClickCountToStart(1);
        table.setDefaultEditor(table.getColumnClass(3), singleclick);
	}
	
	private void crearTotal()
	{
		JPanel p = new JPanel(new FlowLayout(FlowLayout.RIGHT));
		
		tf = new JTextField();
		tf.setPreferredSize(new Dimension(100, 20));
		tf.setHorizontalAlignment(JTextField.RIGHT);
		tf.setEditable(false);
		JLabel label = new JLabel("Total - $");
		
		p.add(label);
		p.add(tf);
		this.add(p);
	}
	
	private void crearBotones()
	{
		JPanel p = new JPanel();
		
		JButton b1 = new JButton("Grabar");
		b1.setName("grabar");
		b1.addActionListener(this);
		JButton b2 = new JButton("Cancelar");
		b2.setName("cancelar");
		b2.addActionListener(this);
		JButton b3 = new JButton("Eliminar");
		b3.setName("eliminar");
		b3.addActionListener(this);
		
		p.add(b1);
		p.add(b2);
		p.add(b3);
		
		add(p);
	}

	@Override
	public void actionPerformed(ActionEvent e) 
	{
		if(((JButton)e.getSource()).getName().equals("eliminar"))
		{
			int row = table.getSelectedRow();
			ProductoVenta v = mv.getElementRow(row);
			mv.removeElement(v);
		}else if(((JButton)e.getSource()).getName().equals("grabar"))
		{
			TableCellEditor editor = table.getCellEditor();
			if (editor != null) {
			  editor.stopCellEditing();
			}
			boolean pasaStock = reducirStock();
			if(pasaStock)
				this.dispose();
		}else
			this.dispose();
	}
	
	private boolean reducirStock()
	{
		int x = 0;
		int y = 0;
		HashMap<Integer, Integer> paraActualizar = new HashMap<Integer, Integer>();
		for(ProductoVenta pv : mv.getList())
		{
			for(Producto p : modeloProducto.getList())
			{
				if(p.getDescripcion().equals(pv.getDescripcion()))
				{
					int nuevaCantidad = modeloProducto.getList().get(y).getCantidad() - mv.getList().get(x).getCantVenta();
					if(nuevaCantidad < 0)
					{	
						JOptionPane.showMessageDialog(this, "No posee stock suficiente de \" " +pv.getDescripcion()+"\" para realizar la venta." ,"Advertencia", JOptionPane.WARNING_MESSAGE);
						return false;
					}
					paraActualizar.put(y, nuevaCantidad);
					break;
				}
				y++;
			}
			x++;
			y=0;
		}
		
		if(paraActualizar.size()>0)
		{
			ProductosDao pDao = new ProductosDao();
			Iterator it = paraActualizar.entrySet().iterator();
			while (it.hasNext()) 
			{
				Entry<Integer, Integer> e = (Entry)it.next();
				modeloProducto.getList().get(e.getKey()).setCantidad(e.getValue());
				pDao.actualizarProducto(modeloProducto.getList().get(e.getKey()));
			}
			modeloProducto.fireTableDataChanged();
			modeloProducto.borrarSeleccion();
		}
		grabarVentas();
		aumentarNumeroVenta();
		return true;
	}
	
	private void aumentarNumeroVenta()
	{
		
	}

	private void grabarVentas()
	{
		VentasDao vDao = new VentasDao();
		for(ProductoVenta pv : mv.getList())
		{
			vDao.guardarVenta(pv);
		}
	}
	
}
